{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "import torch\n",
    "import torch.nn as nn\n",
    "from torch.utils.data import DataLoader\n",
    "import torchvision\n",
    "import torchvision.transforms as transforms\n",
    "import matplotlib.pyplot as plt "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [],
   "source": [
    "device = 'cuda' if torch.cuda.is_available() else 'cpu'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [],
   "source": [
    "input_size = 784\n",
    "hidden_size = 512\n",
    "num_classes = 10\n",
    "learning_rate = 0.001\n",
    "num_epochs = 10\n",
    "batch_size = 64"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [],
   "source": [
    "train_dataset = torchvision.datasets.MNIST(\n",
    "    root='./mnist',\n",
    "    train=True,\n",
    "    download=True,\n",
    "    transform=transforms.ToTensor()\n",
    ")\n",
    "\n",
    "test_dataset = torchvision.datasets.MNIST(\n",
    "    root='./mnist',\n",
    "    train=False,\n",
    "    download=True,\n",
    "    transform=transforms.ToTensor()\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [],
   "source": [
    "train_loader = DataLoader(dataset=train_dataset, batch_size=batch_size, shuffle=True)\n",
    "test_loader = DataLoader(dataset=test_dataset, batch_size=batch_size, shuffle=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 8 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "X, y = next(iter(test_loader))\n",
    "\n",
    "for i in range(8):\n",
    "    plt.subplot(2, 4, i+1)\n",
    "    plt.imshow(X[i][0], cmap='gray')\n",
    "\n",
    "plt.show() "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Model(nn.Module):\n",
    "    def __init__(self, input_size, hidden_size, num_classes):\n",
    "        super().__init__()\n",
    "\n",
    "        self.fc1 = nn.Linear(input_size, hidden_size)\n",
    "        self.fc2 = nn.Linear(hidden_size, num_classes)\n",
    "\n",
    "\n",
    "    def forward(self, x):\n",
    "        x = torch.relu(self.fc1(x))\n",
    "        x = self.fc2(x)\n",
    "        return x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [],
   "source": [
    "model = Model(\n",
    "    input_size=input_size,\n",
    "    hidden_size=hidden_size,\n",
    "    num_classes=num_classes\n",
    ").to(device)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [],
   "source": [
    "criterion = nn.CrossEntropyLoss()\n",
    "optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/10 - Loss: 0.4401831004157657\n",
      "Epoch 2/10 - Loss: 0.15869425279213445\n",
      "Epoch 3/10 - Loss: 0.23912970672416167\n",
      "Epoch 4/10 - Loss: 0.07583203195437364\n",
      "Epoch 5/10 - Loss: 0.11047409396486685\n",
      "Epoch 6/10 - Loss: 0.2212427505705645\n",
      "Epoch 7/10 - Loss: 0.1349722729370194\n",
      "Epoch 8/10 - Loss: 0.1691566488639782\n",
      "Epoch 9/10 - Loss: 0.026490813355968354\n",
      "Epoch 10/10 - Loss: 0.13097183760237047\n"
     ]
    }
   ],
   "source": [
    "model.train()\n",
    "\n",
    "log_every = 1\n",
    "\n",
    "for epoch in range(num_epochs):\n",
    "\n",
    "    for X, y in train_loader:\n",
    "        X = X.reshape(-1, 28*28).to(device)\n",
    "        y = y.to(device)\n",
    "\n",
    "        pred = model(X)\n",
    "        loss = criterion(pred, y)\n",
    "        epoch_loss += loss.item()\n",
    "\n",
    "        optimizer.zero_grad()\n",
    "        loss.backward()\n",
    "        optimizer.step()\n",
    "\n",
    "    epoch_loss /= len(y)\n",
    "\n",
    "    if (epoch+1) % log_every == 0:\n",
    "        print(f'Epoch {epoch+1}/{num_epochs} - Loss: {epoch_loss}')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy: 97.87%\n"
     ]
    }
   ],
   "source": [
    "model.eval()\n",
    "\n",
    "num_correct = 0\n",
    "num_samples = 0\n",
    "\n",
    "for X, y in test_loader:\n",
    "    X = X.reshape(-1, 28*28).to(device)\n",
    "    y = y.to(device)\n",
    "\n",
    "    _, pred = model(X).max(dim=1)\n",
    "    num_correct += (pred == y).sum().item()\n",
    "    num_samples += y.size(0)\n",
    "\n",
    "acc = 100 * num_correct / num_samples\n",
    "print(f'Accuracy: {acc}%')"
   ]
  }
 ],
 "metadata": {
  "interpreter": {
   "hash": "a95fb4d359174931ce10a0947fed8fd7c7859df778694c2a0aeaa1eb23cb6458"
  },
  "kernelspec": {
   "display_name": "Python 3.8.8 64-bit ('3.8.8': pyenv)",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.8"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
